home *** CD-ROM | disk | FTP | other *** search
- * Raster.s
- * ラスタースクロール / 最高速 = 1
- *
- * 注意事項
- * ワイプ中、Timer-C/D を停止します。
- * 音楽演奏しながらワイプする場合、ラスタースクロールに対応した
- * 音源ドライバを使用して下さい( ZMUSIC.X なら ZMUSIC.X -M で常駐して下さい)。
-
-
- SPEED_MAX equ 1
-
- .offset 8 * 引き数
- _source_ptr: .ds.l 1
- _dest_ptr: .ds.l 1
- _speed: .ds.l 1
- _vdisp: .ds.l 1
-
-
-
- gpos .macro pos_x,pos_y
- .dc.w (pos_y*1024)+(pos_x*2)
- .endm
-
-
- .include IOCSCALL.MAC
-
- CRTC_R09 equ $e8_0012 * ラスター割り込み位置
- CRTC_R12 equ $e8_0018 * スクロールX座標
- CRTC_R14 equ $e8_001c
- CRTC_R16 equ $e8_0020
- CRTC_R18 equ $e8_0024
- GPIP_DATA equ $e8_8001
- MFP_IERB equ $e8_8009
- MFP_IMRB equ $e8_8015
-
-
- .offset 0
- old_mfp_ierb:
- .ds.b 1 * MFP レジスタ退避用
- old_mfp_imrb:
- .ds.b 1
-
- .even
- raster_num: * 割り込むラスター
- .ds.w 1 * CRTC_R09 に入れる値
- counter:
- .ds.w 1
- counter_2:
- .ds.w 1
- counter_from:
- .ds.w 1
- counter_to:
- .ds.w 1
- amplitude_counter: * 振幅カウンター
- .ds.w 1 * 初期値 0->256->512 : 振幅 0->256->0
- amplitude: * 振幅
- .ds.w 1 * 振幅 0->256->0
- amplitude_inc: * 振幅に加算する数値
- .ds.w 1
-
- .even
- WORKSIZE:
-
-
- .text
- .even
-
- .dc.b 'WL10',$0d,$0a
- .dc.b 'ラスタースクロール / 最高速 = 1',$0d,$0a
- .dc.b ' by Mitsuky',$0d,$0a
- .dc.b $1a
-
- .even
- Raster:
- link a6,#0
- movem.l d1-d7/a0-a5,-(sp)
-
- move.l _speed(a6),d0 * d0.w =
- bmi main_ask_speed
- cmpi.l #SPEED_MAX,d0
- bhi main_err
-
- tst.l _vdisp(a6)
- bmi main_ask_vdisp
-
-
- lea.l work(pc),a0
- move.b MFP_IERB,old_mfp_ierb(a0) * MFP のレジスタを保存
- move.b MFP_IMRB,old_mfp_imrb(a0)
- andi.b #$cf,MFP_IERB * Timer - C / D 停止
- andi.b #$cf,MFP_IMRB * 〃 マスク
-
-
- lea.l work(pc),a0
- clr.w raster_num(a0) * 割り込むラスター
- clr.w counter(a0)
- clr.w amplitude_counter(a0)
- clr.w amplitude(a0)
-
- tst.l _speed(a6)
- bne 1f
- * 速度 = 0
- move.w #256-64,counter_from(a0)
- move.w #256+64,counter_to(a0)
- move.w #1,amplitude_inc(a0)
- bra 2f
- 1: * 速度 = 1
- move.w #256/2-64,counter_from(a0)
- move.w #256/2+64,counter_to(a0)
- move.w #2,amplitude_inc(a0)
- 2:
-
- bsr vdisp
-
- moveq.l #40,d1
- lea.l hsync_routine(pc),a1
- IOCS _CRTCRAS
- tst.l d0
- bne main_err
-
-
-
- movea.l _source_ptr(a6),a2 * a2.l = 転送元アドレス・その1
- movea.l _dest_ptr(a6),a3 * a3.l = 転送先アドレス・その1
- lea.l table(pc),a4 * a4.l = テーブル
-
-
- loop:
- bsr vdisp *! debug
-
- lea.l work(pc),a0
- move.w counter(a0),d0
- move.w d0,counter_2(a0)
- addq.w #1,d0
- move.w d0,counter(a0)
-
- move.w amplitude_counter(a0),d0
- add.w amplitude_inc(a0),d0
- move.w d0,amplitude_counter(a0)
- cmpi.w #256,d0
- bls @f
- move.w #512,d1
- sub.w d0,d1
- move.w d1,d0
- @@: move.w d0,amplitude(a0)
-
-
- move.w counter(a0),d0
- cmp.w counter_from(a0),d0
- bcs main_no_trans
- cmp.w counter_to(a0),d0
- bcc main_no_trans
-
-
- movea.l a2,a0
- movea.l a3,a1
-
- lsr.w d0
- bcc @f
-
- adda.l #256*1024,a0
- adda.l #256*1024,a1
- adda.w (a4),a2
- adda.w (a4)+,a3
- @@:
-
-
- moveq.l #64/2-1,d5
- main_loop_y:
- moveq.l #64/32-1,d4
- main_loop_x:
- move.w (a0),(a1)
- move.w 16*1(a0),16*1(a1)
- move.w 16*2(a0),16*2(a1)
- move.w 16*3(a0),16*3(a1)
- move.w 16*4(a0),16*4(a1)
- move.w 16*5(a0),16*5(a1)
- move.w 16*6(a0),16*6(a1)
- move.w 16*7(a0),16*7(a1)
- move.w 16*8(a0),16*8(a1)
- move.w 16*9(a0),16*9(a1)
- move.w 16*10(a0),16*10(a1)
- move.w 16*11(a0),16*11(a1)
- move.w 16*12(a0),16*12(a1)
- move.w 16*13(a0),16*13(a1)
- move.w 16*14(a0),16*14(a1)
- move.w 16*15(a0),16*15(a1)
- move.w 16*16(a0),16*16(a1)
- move.w 16*17(a0),16*17(a1)
- move.w 16*18(a0),16*18(a1)
- move.w 16*19(a0),16*19(a1)
- move.w 16*20(a0),16*20(a1)
- move.w 16*21(a0),16*21(a1)
- move.w 16*22(a0),16*22(a1)
- move.w 16*23(a0),16*23(a1)
- move.w 16*24(a0),16*24(a1)
- move.w 16*25(a0),16*25(a1)
- move.w 16*26(a0),16*26(a1)
- move.w 16*27(a0),16*27(a1)
- move.w 16*28(a0),16*28(a1)
- move.w 16*29(a0),16*29(a1)
- move.w 16*30(a0),16*30(a1)
- move.w 16*31(a0),16*31(a1)
- lea.l 16*32(a0),a0
- lea.l 16*32(a1),a1
- dbra d4,main_loop_x
-
- lea.l 7*512*2(a0),a0
- lea.l 7*512*2(a1),a1
- dbra d5,main_loop_y
-
- main_no_trans:
-
- lea.l work(pc),a0
- move.w amplitude_counter(a0),d0
- cmpi.w #512,d0
- bne loop
-
-
- main_rts:
- suba.l a1,a1
- IOCS _CRTCRAS
-
- lea.l work(pc),a0
- move.b old_mfp_ierb(a0),MFP_IERB
- move.b old_mfp_imrb(a0),MFP_IMRB
-
- moveq.l #0,d0
- move.w d0,CRTC_R12
- move.w d0,CRTC_R14
- move.w d0,CRTC_R16
- move.w d0,CRTC_R18
- moveq.l #0,d0
- main_rts_2:
- movem.l (sp)+,d1-d7/a0-a5
- unlk a6
- rts
-
-
- **** ****
- main_err:
- moveq.l #-1,d0
- bra main_rts_2
-
-
- **** ****
- main_ask_speed:
- moveq.l #SPEED_MAX,d0
- bra main_rts_2
-
-
- **** ****
- main_ask_vdisp:
- move.l _speed(a6),d0
- lea.l ask_vdisp_table(pc),a0
- add.w d0,d0
- move.w (a0,d0.w),d0
- bra main_rts_2
-
- ask_vdisp_table:
- .dc.w 512+1,256+1
-
-
- **** ****
- vdisp:
- movem.l a0,-(sp)
- move.l _vdisp(a6),a0
- jsr (a0)
- movem.l (sp)+,a0
- rts
-
-
- *********************************************************
- hsync_routine:
- movem.l d0/a0,-(sp)
- * move.w sr,-(sp)
- * ori.w #$0700,sr
-
- lea.l work(pc),a0
- move.w raster_num(a0),d0
- * addq.w #1,d0
- addq.w #2,d0
-
- andi.w #511,d0
- move.w d0,raster_num(a0)
- addi.w #40,d0
- move.w d0,CRTC_R09
-
-
- move.w counter_2(a0),d0
- addq.w #2,d0
- move.w d0,counter_2(a0)
- andi.w #127,d0
- add.w d0,d0
- move.w sintable(pc,d0.w),d0
-
- muls.w amplitude(a0),d0
- swap.w d0
- add.w d0,d0
-
- move.w d0,CRTC_R12
- move.w d0,CRTC_R14
- move.w d0,CRTC_R16
- move.w d0,CRTC_R18
-
- hsync_routine_rts:
- * move.w (sp)+,sr
- movem.l (sp)+,d0/a0
- rte
-
-
- *********************************************************
- sintable:
- .dc.w 0,1607,3211,4807,6392,7961,9511,11038
- .dc.w 12539,14009,15446,16845,18204,19519,20787,22004
- .dc.w 23169,24278,25329,26318,27244,28105,28897,29621
- .dc.w 30272,30851,31356,31785,32137,32412,32609,32727
- .dc.w 32767,32727,32609,32412,32137,31785,31356,30851
- .dc.w 30272,29621,28897,28105,27244,26318,25329,24278
- .dc.w 23169,22004,20787,19519,18204,16845,15446,14009
- .dc.w 12539,11038,9511,7961,6392,4807,3211,1607
- .dc.w 0,-1607,-3211,-4807,-6392,-7961,-9511,-11038
- .dc.w -12539,-14009,-15446,-16845,-18204,-19519,-20787,-22004
- .dc.w -23169,-24278,-25329,-26318,-27244,-28105,-28897,-29621
- .dc.w -30272,-30851,-31356,-31785,-32137,-32412,-32609,-32727
- .dc.w -32767,-32727,-32609,-32412,-32137,-31785,-31356,-30851
- .dc.w -30272,-29621,-28897,-28105,-27244,-26318,-25329,-24278
- .dc.w -23169,-22004,-20787,-19519,-18204,-16845,-15446,-14009
- .dc.w -12539,-11038,-9511,-7961,-6392,-4807,-3211,-1607
-
- work:
- .ds.b WORKSIZE
- .even
-
- *********************************************************
- table:
- gpos 4,4
- gpos -2,2
- gpos 3,-5
- gpos 2,2
- gpos -5,-1
- gpos 4,4
- gpos -3,1
- gpos 4,-6
- gpos -7,3
- gpos 7,3
- gpos -3,-5
- gpos -3,3
- gpos 5,-5
- gpos -3,3
- gpos 2,4
- gpos 1,-5
- gpos -4,-2
- gpos 1,5
- gpos 3,-1
- gpos -3,-3
- gpos 4,4
- gpos -6,-2
- gpos 3,3
- gpos 1,-3
- gpos -1,-3
- gpos -4,2
- gpos 1,5
- gpos 4,-2
- gpos -4,-4
- gpos -1,5
- gpos 2,-2
-
- gpos -1,-4
-
- gpos 4,4
- gpos -2,2
- gpos 3,-5
- gpos -6,2
- gpos 3,-1
- gpos 4,4
- gpos -3,1
- gpos -4,-6
- gpos 1,3
- gpos -1,3
- gpos 5,-5
- gpos -3,3
- gpos 5,-5
- gpos -3,3
- gpos 2,4
- gpos 1,-5
- gpos -4,-2
- gpos 1,5
- gpos 3,-1
- gpos -3,-3
- gpos -4,4
- gpos 2,-2
- gpos 3,3
- gpos 1,-3
- gpos -1,-3
- gpos -4,2
- gpos 1,5
- gpos 4,-2
- gpos -4,-4
- gpos -1,5
- gpos 2,-2
-
- gpos 0,0 * ダミー(一応)
-
-